/*********************************
*-- 33 KDH Knieja ---------------*
*-- im. Harcerzy Września 1939 --*
*-- autor: Marcin Rzepisko ------*
*-- data: 2013-11-11 ------------*
**********************************/

package net.kdh.knieja.kontroler.impl;

import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.interceptor.Interceptors;
import net.kdh.knieja.dao.impl.ObslugaPostowDaoImpl;
import net.kdh.knieja.dao.interfejsy.ObslugaPostowDAO;
import net.kdh.knieja.dao.klasy.filtry.FiltrPostowDAO;
import net.kdh.knieja.kontroler.interfejsy.ObslugaPostowUsluga;
import net.kdh.knieja.kontroler.narzedzia.KontrolaDostepuInterceptor;
import net.kdh.knieja.kontroler.narzedzia.Walidator;
import net.kdh.knieja.model.system.Post;
import net.kdh.knieja.model.system.token.Token;
import net.kdh.knieja.model.system.token.TokenModa;
import net.kdh.knieja.model.wspolne.adnotacje.Uprawnienia;
import net.kdh.knieja.model.wspolne.enumeracje.TypKontaEnum;
import net.kdh.knieja.model.wspolne.wyjatki.BladAutoryzacjiWyjatek;
import net.kdh.knieja.model.wspolne.wyjatki.BladWalidacjiWyjatek;
import net.kdh.knieja.model.wspolne.wyjatki.BladWarstwyDaoWyjatek;

/**
 *
 * @author rz.marcin@gmail.com
 */
@Interceptors(KontrolaDostepuInterceptor.class)
@Stateless
public class ObslugaPostowUslugaImpl implements ObslugaPostowUsluga {
    
    @Inject
    private ObslugaPostowDAO obslugaPostowDAO;
    private Walidator walidator = new Walidator();
    
    @Override
    public List<Post> pobierzPostyArtykulu(String idArtykulu) throws BladWalidacjiWyjatek {
        List<Post> lista;
        try {
            lista = obslugaPostowDAO.pobierzPostyArtykulu(idArtykulu);
        } catch (BladWarstwyDaoWyjatek ex) {
            throw new BladWalidacjiWyjatek("ObslugaPostowUslugaImpl.pobierzPostyArtykulu()"+ex.getLocalizedMessage());
        }
        return lista;
    }

    @Override
    @Uprawnienia(TypKontaEnum.USR)
    public List<Post> pobierzPostyUzytkownika(String idUzytkownika, Token token) throws BladWalidacjiWyjatek {
        walidator.weryfikujKlase(token);
        FiltrPostowDAO filtr = new FiltrPostowDAO();
        filtr.setIdAutora(idUzytkownika);
        try {
            return obslugaPostowDAO.pobierzPosty(filtr);
        } catch (BladWarstwyDaoWyjatek ex) {
            throw new BladWalidacjiWyjatek("ObslugaPostowUslugaImpl.pobierzPostyUzytkownika()"+ex.getLocalizedMessage());
        }
    }

    @Override
    @Uprawnienia(TypKontaEnum.MOD)
    public List<Post> pobierzHistoriePostu(String idPostu, Token token) throws BladWalidacjiWyjatek, BladAutoryzacjiWyjatek {
        if(!(token instanceof TokenModa))
            throw new BladAutoryzacjiWyjatek("ObslugaPostowUslugaImpl.pobierzHistoriePostu()");
        walidator.weryfikujKlase(token);
        
        try {
        return obslugaPostowDAO.pobierzHistoriePostu(idPostu);
        } catch (BladWarstwyDaoWyjatek ex ) {
            throw new BladWalidacjiWyjatek("ObslugaPostowUslugaImpl.pobierzHistoriePostu()"+ex.getLocalizedMessage());
        }
    }

    @Override
    @Uprawnienia(TypKontaEnum.USR)
    public String dodajPost(Post post, Token token) throws BladWalidacjiWyjatek, BladAutoryzacjiWyjatek {
        walidator.weryfikujKlase(token, post);
        try {
        return obslugaPostowDAO.dodajPost(post);
        } catch (BladWarstwyDaoWyjatek ex) {
            throw new BladWalidacjiWyjatek("ObslugaPostowUslugaImpl.dodajPost()"+ex.getLocalizedMessage());
        }
    }

    @Override
    @Uprawnienia(TypKontaEnum.USR)
    public String edytujPost(Post post, Token token) throws BladWalidacjiWyjatek, BladAutoryzacjiWyjatek {
        walidator.weryfikujKlase(token, post);
        //uzytkownik edytujac posta zapisuje jego historię, może edytować tylko swoje posty
        if (!(token instanceof TokenModa)) {
            if (!post.getIdAutora().equals(token.getIdUzytkownika())) {
                throw new BladAutoryzacjiWyjatek("ObslugaPostowUslugaImpl.edytujPost() @rozne id autorow");
            }
            post.setIdEdytowanegoPostu(post.getIdPostu());
            try {
                post.setIdEdytowanegoPostu(post.getIdPostu());
                return obslugaPostowDAO.dodajPost(post);
            } catch (BladWarstwyDaoWyjatek ex) {
                throw new BladWalidacjiWyjatek("ObslugaPostowUslugaImpl.edytujPost() uzytkownik@nie mozna edytowac postu" + ex.getLocalizedMessage());
            }
        }
        //mod+ edytując posta nie zostawia śladu w historii
        try {
            obslugaPostowDAO.edytujPost(post);
            return "";
        } catch (BladWarstwyDaoWyjatek ex) {
            throw new BladWalidacjiWyjatek("ObslugaPostowUslugaImpl.edytujPost() +mod@nie mozna edytowac postu" + ex.getLocalizedMessage());
        }
    }

    @Override
    @Uprawnienia(TypKontaEnum.MOD)
    public void usunPost(String idPostu, Token token) throws BladWalidacjiWyjatek, BladAutoryzacjiWyjatek {
        walidator.weryfikujKlase(token);
        if (token instanceof TokenModa) {
            try {
                obslugaPostowDAO.usunPost(idPostu);
            } catch (BladWarstwyDaoWyjatek ex) {
                throw new BladWalidacjiWyjatek("ObslugaPostowUsluga.usunPost() @TokenModa");
            }
            return;
        }
        try {
            Post post = obslugaPostowDAO.pobierzPost(idPostu);
            
            if(!post.getIdAutora().equals(token.getIdUzytkownika())) {
                throw new BladWalidacjiWyjatek("ObslugaPostowUsluga.usunPost() @Uzytkownicy mogą usuwac tylko swoje posty");
            }
            obslugaPostowDAO.oznaczPostJakoUsuniety(idPostu);
        } catch (BladWarstwyDaoWyjatek ex) {
            throw new BladWalidacjiWyjatek("ObslugaPostowUsluga.usunPost() @obslugaPostowDAO"+ex.getLocalizedMessage());
        }
    }
}
